﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Security.Cryptography;


namespace NetworkManager
{
	public partial class NetworkManager
	{
		private string accountname;
		private string password;
		public string sessionid = "";
		public string server;
		private bool logged = false;

		#region enums
		public enum RequestFormat
		{
			CHARACTER	= 004,
			GUILD		= 006,
			CHATWRITE	= 516, //516 + text
			GUILRANK	= 503, //503 + rang
			POSTCONTENT	= 507, //507 + id
		}
		public enum Stats
		{
			STRENGTH = 1,
			DEXTERITY = 2,
			INTELLIGENCE = 3,
			STAMINA = 4,
			LUCK = 5,
			ALLSTATS = 6,
			DUARTION = 11,
			LIFE = 16,
		}
		public enum Slots
		{
			WEAPON = 1,
			SHIELD = 2,
			BREAST = 3,
			FEET = 4,
			HANDS = 5,
			HELMET = 6,
			BELT = 7,
			NECKLACE = 8,
			RING = 9,
			TRINKET = 10,
			KEY = 11,
			FLASK = 12,
		}
		public enum CacheFormat
		{
			NULL0,				    	//
			ACCOUNTID,			    	// Account ID
			NULL1,				    	// Timestamp
			NULL2,				    	// Timestamp Accounterstellung?
			NULL3,				    	//
			NULL4,				    	//
			NULL5,				    	//
			LEVEL,				    	// Level
			EXPERIENCE,			    	// Erfahrung zurzeit
			EXPERIENCELEVEL,			// Erfahrung für Levelaufstieg
			HONOR,						// Ehre
			RANK,						// Rangplatz
			NULL6,						//
			GOLD,						// Gold in Silber (Gold /= 100)
			MUSHROOMS,					// Pilze
			NULL7,						// 
			NULL8,						// 
			NULL9,						//
			NULL10,						// 
			NULL11,						// 
			NULL12,						//
			NULL13,						//
			NULL14,						//
			NULL15,						//
			NULL16,						//
			NULL17,						//
			NULL18,						//
			NULL19,						//
			NULL20,						//
			NULL21,						//
			BASESTR,					// Basis STR 
			BASEDEX,					// Basis GES 
			BASEINT,					// Basis INT 
			BASESTAM,					// Basis AUS 
			BASELUCK,					// Basis LUCK 
			BONUSSTR,					// Bonus STR
			BONUSDEX,					// Bonus GES
			BONUSINT,					// Bonus INT
			BONUSSTAM,					// Bonus AUS
			BONUSLUCK,					// Bonus LUCK
			STR0,						// ?STR
			DEX0,						// ?GES
			INT0,						// ?INT
			STAM0,						// ?AUS
			LUCK0,						// ?LUCK
			NULL22,						//
			NULL23,						//
			NULL24,						//
			HELMSLOTID,					// Helm Slot ID
			HELMLOOK,					// Aussehen
			HELMARMOR,					// Rüstung Helm
			NULL25,						// 
			HELMATRID1,					// Attribut 1 ID
			HELMATRID2,					// Attribut 2 ID
			HELMATRID3,					// Attribut 3 ID
			HEMLATR1,					// Attribut 1 +
			HELMATR2,					// Attribut 2 +
			HELMATR3,					// Attribut 3 +
			HELM0,					 	// Helm (Template) ID?
			NULL26,						// ------------------
			BREASTSLOTID,				// Brust Slot ID
			BREASTLOOK,					// Aussehen
			BREASTARMOR,				// Rüstung Brust
			NULL27,						//
			BREASTATRID1,				// Attribut 1 ID
			BREASTATRID2,				// Attribut 2 ID
			BREASTATRID3,				// Attribut 3 ID
			BREASTATR1,					// Attribut 1 +
			BREASTATR2,					// Attribut 2 + 
			BREASTATR3,					// Attribut 3 +
			BREAST0,					// Brust (Template) ID?
			NULL28,						// ------------------
			HANDSSLOTID,				// Hände Slot ID
			HANDSLOOK,					// Aussehen
			HANDSARMOR,					// Rüstung Hände
			NULL29,						//
			HANDSARTID1,				// Attribut 1 ID
			HANDSARTID2,				// Attribut 2 ID
			HANDSARTID3,				// Attribut 3 ID
			HANDSATR1,					// Attribut 1 +
			HANDSATR2,					// Attribut 2 +
			HANDSATR3,					// Attribut 3 +
			HANDS0,						// Hände (Template) ID?
			NULL30,						// ------------------
			FEETSLOTID,					// Füße Slot ID
			FEETLOOK,					// Aussehen
			FEETARMOR,					// Rüstung Füße
			NULL31,						//
			FEETATRID1,					// Attribut 1 ID
			FEETATRID2,					// Attribut 2 ID
			FEETATRID3,					// Attribut 3 ID
			FEETATR1,					// Attribut 1 +
			FEETATR2,					// Attribut 2 +
			FEETATR3,					// Attribut 3 +
			FEET0,						// Füße (Template) ID?
			NULL32,						// ------------------
			NECKSLOTID,					// Hals Slot ID
			NECKLOOK,					// Aussehen
			NECKARMOR,					// Rüstung Hals
			NULL33,						//
			NECKATRID1,					// Attribut 1 ID
			NECKATRID2,					// Attribut 2 ID
			NECKATRID3,					// Attribut 3 ID
			NECKATR1,					// Attribut 1 +
			NECKATR2,					// Attribut 2 +
			NECKATR3,					// Attribut 3 +
			NECK0,						// Hals (Template) ID?
			NULL34,						// ------------------
			BELTSLOTID,					// Gürtel Slot ID
			BELTLOOK,					// Aussehen
			BELTARMOR,					// Rüstung Gürtel
			NULL35,						//
			BELTATRID1,					// Attribut 1 ID
			BELTATRID2,					// Attribut 2 ID
			BELTATRID3,					// Attribut 3 ID
			BELTATR1,					// Attribut 1 +
			BELTATR2,					// Attribut 2 +
			BELTATR3,					// Attribut 3 +
			BELT0,						// Gürtel (Template) ID?
			NULL36,						// ------------------
			RINGSLOTID,					// Ring Slot ID
			RINGLOOK,					// Aussehen
			RINGARMOR,					// Rüstung Ring
			NULL37,						//
			RINGATRID1,					// Attribut 1 ID
			RINGATRID2,					// Attribut 2 ID
			RINGATRID3,					// Attribut 3 ID
			RINGATR1,					// Attribut 1 +
			RINGATR2,					// Attribut 2 +
			RINGATR3,					// Attribut 3 +
			RING0,						// Ring (Template) ID?
			NULL38,						// ------------------
			TRINKETSLOTID,				// Schmuck Slot ID
			TRINKETLOOK,				// Aussehen
			TRINKETARMOR,				// Rüstung Schmuck
			NULL39,						//
			TRINKETATRID1,				// Attribut 1 ID
			TRINKETATRID2,				// Attribut 2 ID
			TRINKETATRID3,				// Attribut 3 ID
			TRINKETATR1,				// Attribut 1 +
			TRINKETATR2,				// Attribut 2 +
			TRINKETATR3,				// Attribut 3 +
			TRINKET0,					// Schmuck (Template) ID?
			NULL40,						// ------------------
			WEAOPONSLOTID,				// Waffe Slot ID
			WEAPONLOOK,					// Aussehen
			WEAPONMINDMG,				// Waffe Min DMG
			WEAPONMAXDMG,				// Waffe Max DMG
			WEAPONATRID1,				// Attribut 1 ID
			WEAPONATRID2,				// Attribut 2 ID
			WEAPONATRI3,				// Attribut 3 ID
			WEAPONATR1,					// Attribut 1 +
			WEAPONATR2,					// Attribut 2 +
			WEAPONATR3,					// Attribut 3 +
			WEAPON0,					// Waffe (Template) ID?
			NULL41,						// ------------------
			SHIELDSLOTID,				// Schild Slot ID
			SHIELDLOOK,					// Aussehen
			SHIELDBLOCK,				// Blocken Schild
			NULL42,						// 
			SHIELDATRID1,				// Attribut 1 ID
			SHIELDATRID2,				// Attribut 2 ID
			SHIELDATRID3,				// Attribut 3 ID
			SHIELDATR1,					// Attribut 1 +
			SHIELDATR2,					// Attribut 2 +
			SHIELDATR3,					// Attribut 3 +
			SHIELD0,					// Schild (Template) ID?
			NULL43,						// ------------------
			INV1SLOTID,					// Slot ID
			INV1LOOK,					// Aussehen
			INV1MINDMG,					// Waffenschaden min
			INV1MAXDMG,					// Waffenschaden max
			INV1ATRID1,					// Slot 1 Stat 1 ID
			INV1ATRID2,					// Slot 1 Stat 2 ID
			INV1ATRID3,					// Slot 1 Stat 3 ID
			INV1ATR1,					// Slot 1 Stat 1 +
			INV1ATR2,					// Slot 1 Stat 2 +
			INV1ATR3,					// Slot 1 Stat 3 +
			NULL44,						// 
			NULL45,						// ------------------
			INV2SLOTID,					// Slot ID
			INV2LOOK,					// Aussehen
			INV2MINDMG,					// Waffenschaden min
			INV2MAXDMG,					// Waffenschaden max
			INV2ATRID1,					// Slot 2 Stat 1 ID
			INV2ATRID2,					// Slot 2 Stat 2 ID
			INV2ATRID3,					// Slot 2 Stat 3 ID
			INV2ATR1,					// Slot 2 Stat 1 +
			INV2ATR2,					// Slot 2 Stat 2 +
			INV2ATR3,					// Slot 2 Stat 3 +
			NULL46,						//
			NULL47,						// ------------------
			INV3SLOTID,					// Slot ID
			INV3LOOK,					// Aussehen
			INV3MINDMG,					// Waffenschaden min
			INV3AXDMG,					// Waffenschaden max
			INV3ATRID1,					// Slot 3 Stat 1 ID
			INV3ATRID2,					// Slot 3 Stat 2 ID
			INV3ATRID3,					// Slot 3 Stat 3 ID
			INV3ATR1,					// Slot 3 Stat 1 +
			INV3ATR2,					// Slot 3 Stat 2 +
			INV3ATR3,					// Slot 3 Stat 3 +
			NULL48,						//
			NULL49,						// ------------------
			INV4SLOTID,					// Slot ID
			INV4LOOK,					// Aussehen
			INV4MINDMG,					// Waffenschaden min
			INV4MAXDMG,					// Waffenschaden max
			INV4ATRID1,					// Slot 4 Stat 1 ID
			INV4ATRID2,					// Slot 4 Stat 2 ID
			INV4ATRID3,					// Slot 4 Stat 3 ID
			INV4ATR1,					// Slot 4 Stat 1 +
			INV4ATR2,					// Slot 4 Stat 2 +
			INV4ATR3,					// Slot 4 Stat 3 +
			NULL50,						//
			NULL51,						// ------------------
			INV5SLOTID,					// Slot ID
			INV5LOOK,					// Aussehen
			INV5MINDMG,					// Waffenschaden min
			INV5MAXDMG,					// Waffenschaden max
			INV5ATRID1,					// Slot 5 Stat 1 ID
			INV5ATRID2,					// Slot 5 Stat 2 ID
			INV5ATRID3,					// Slot 5 Stat 3 ID
			INV5ATR1,					// Slot 5 Stat 1 +
			INV5ATR2,					// Slot 5 Stat 2 +
			INV5ATR3,					// Slot 5 Stat 3 +
			NULL52,						//
			NULL53,						// ------------------
			NULL54,						//
			NULL55,						// Stat?
			NULL56,						// Stat?
			NULL57,						// Stat?
			NULL58,						// Stat ID?
			NULL59,						// Stat ID?
			NULL60,						// Stat ID?
			NULL61,						//
			NULL62,						//
			NULL63,						//
			NULL64,						//
			NULL65,						//
			NULL66,						//
			NULL67,						//
			NULL68,						//
			NULL69,						//
			NULL70,						//
			NULL71,						//
			NULL72,						//
			NULL73,						//
			NULL74,						//
			NULL75,						//
			NULL76,						//
			NULL77,						//
			NULL78,						//
			NULL79,						//
			NULL80,						//
			NULL81,						//
			NULL82,						//
			NULL83,						//
			NULL84,						//
			NULL85,						//
			NULL86,						//
			NULL87,						//
			NULL88,						//
			NULL89,						//
			NULL90,						//
			NULL91,						//
			NULL92,						//
			NULL93,						//
			NULL94,						//
			NULL95,						//
			NULL96,						//
			NULL97,						//
			NULL98,						//
			NULL99,						//
			NULL100,					//
			NULL101,					//
			NULL102,					//
			NULL103,					//
			NULL104,					//
			NULL105,					//
			NULL106,					//
			NULL107,					//
			NULL310,					//
			NULL108,					//
			NULL109,					//
			NULL110,					//
			NULL111,					//
			NULL112,					//
			NULL113,					//
			NULL114,					//
			NULL115,					//
			NULL116,					//
			NULL117,					//
			NULL118,					//
			NULL119,					//
			NULL120,					//
			NULL121,					//
			NULL122,					//
			NULL123,					//
			NULL124,					//
			NULL125,					//
			NULL126,					//
			NULL127,					//
			NULL128,					//
			NULL129,					//
			NULL130,					//
			NULL131,					//
			NULL132,					//
			NULL133,					//
			NULL134,					//
			NULL135,					//
			NULL136,					//
			NULL137,					//
			NULL138,					//
			NULL139,					//
			NULL140,					//
			NULL141,					//
			NULL142,					//
			NULL143,					//
			NULL144,					//
			NULL145,					//
			NULL146,					//
			NULL147,					//
			NULL148,					//
			NULL149,					//
			NULL150,					//
			NULL151,					//
			NULL152,					//
			NULL153,					//
			NULL154,					//
			NULL155,					//
			NULL156,					//
			NULL157,					//
			NULL158,					//
			NULL159,					//
			NULL160,					//
			NULL161,					//
			NULL162,					//
			NULL163,					//
			NULL164,					//
			NULL165,					//
			NULL166,					//
			NULL167,					//
			NULL168,					//
			NULL169,					//
			NULL170,					//
			NULL171,					//
			NULL172,					//
			NULL173,					//
			NULL174,					//
			NULL175,					//
			NULL176,					//
			NULL177,					//
			NULL178,					//
			NULL179,					//
			NULL180,					//
			NULL181,					//
			NULL182,					//
			NULL183,					//
			NULL184,					//
			NULL185,					//
			NULL186,					//
			NULL187,					//
			NULL188,					//
			NULL189,					//
			NULL190,					//
			NULL191,					//
			NULL192,					//
			NULL193,					//
			NULL194,					//
			NULL195,					//
			NULL196,					//
			NULL197,					//
			NULL198,					//
			NULL199,					//
			NULL200,					//
			NULL201,					//
			NULL202,					//
			NULL203,					//
			NULL204,					//
			NULL205,					//
			NULL206,					//
			NULL207,					//
			NULL208,					//
			NULL209,					//
			NULL210,					//
			NULL211,					//
			NULL222,					//
			NULL223,					//
			NULL224,					//
			NULL225,					//
			NULL226,					//
			NULL227,					//
			NULL228,					//
			NULL229,					//
			NULL230,					//
			NULL231,					//
			NULL232,					//
			NULL233,					//
			NULL234,					//
			NULL235,					//
			NULL236,					//
			NULL237,					//
			NULL238,					//
			NULL239,					//
			NULL240,					//
			NULL241,					//
			NULL242,					//
			NULL243,					//
			NULL244,					//
			NULL245,					//
			NULL246,					//
			NULL247,					//
			NULL248,					//
			NULL249,					//
			NULL250,					//
			NULL251,					//
			NULL252,					//
			NULL253,					//
			NULL254,					//
			NULL255,					//
			NULL256,					//
			NULL257,					//
			NULL258,					//
			NULL259,					//
			NULL260,					//
			NULL261,					//
			NULL262,					//
			NULL263,					//
			NULL264,					//
			NULL265,					//
			NULL266,					//
			NULL267,					//
			NULL268,					//
			NULL269,					//
			NULL270,					//
			NULL271,					//
			NULL272,					//
			NULL273,					//
			NULL274,					//
			NULL275,					//
			NULL276,					//
			NULL277,					//
			NULL278,					//
			NULL279,					//
			NULL280,					//
			NULL281,					//
			ARMOR,						// Rüstung
			NULL282,					//
			NULL283,					//
			NULL284,					//
			MOUNTEXPIRE,				// Mount Ende
			NULL285,					//
			NULL286,					//
			NULL287,					//
			NULL288,					//
			NULL289,					// 
			NULL290,					//
			DUNGEONTIERS1,				// Dungeonebenen gereinigt
			NULL291,					// ?
			NULL292,					// ?
			NULL293,					//
			NULL294,					//
			NULL295,					//
			ACCOUNTCREATION,			// Accountertellungsdatum
			LEVEL1,						// Level
			DUNGEONTIERS2,				// Dungeons gereinigt
			FIGHTSWON,					// Gewonnene Kämfpe
			ADVENTURESDONE,				// Abenteuer 
			WORKEDHOURS,				// Arbeitsstunden
			MONEYEARNED,				// Verdientes Geld
			HONOR2,						// Ehre
			FRIENDSCALLED,				// Freunde geworben
			NULL296,					//
			MEDALBONUS,					// Orden Bonus
			NULL297,					//
			NULL298,					//
			NULL299,					//
			LASTLOGIN0,					// Last Login ?
			NULL300,					//
			DUNGEON1,					// Dungeon 1
			DUNGEON2,					// Dungeon 2
			DUNGEON3,					// Dungeon 3
			DUNGEON4,					// Dungeon 4
			DUNGEON5,					// Dungeon 5
			DUNGEON6,					// Dungeon 6
			DUNGEON7,					// Dungeon 7
			DUNGEON8,					// Dungeon 8
			DUNGEON9,					// Dungeon 9
			DUNGEON10,					// Dungeon 10
			DUNGEON11,					// Dungeon 11
			DUNGEON12,					// Dungeon 12
			NULL301,					// ------------------
			FLASKID1,					// Trank 1 Stat ID
			FLASKID2,					// Trank 2 Stat ID
			FLASKID3,					// Trank 3 Stat ID
			FLASKTIMESTAMP1,			// Trank 1 Timestamp
			FLASKTIMESTAMP2,			// Trank 2 Timestamp
			FLASKTIMESTAMP3,			// Trank 3 Timestamp
			FLASKBONUS1,				// Trank 1 Bonus
			FLASKBONUS2,				// Trank 2 Bonus
			FLASKBONUS3,				// Trank 3 Bonus
			NULL302,					// 
			NULL303,					//
			NULL304,					//
			NULL305,					//
			NULL306,					//
			NULL307,					//
			NULL308,					//
			NULL309,					//
			TIMENOW,					// Time Now
			CHARDESCRIPTION,			// Charbeschreibung
			NULL312,					//
			SESSIONID,					// Sesseion ID (nur beim Login)
			NULL311,					//
		}
		public enum Dungeon
		{
			CLOSED0 = 0,
			CLOSED1 = 1,
			STAGE1 = 2,
			STAGE2 = 3,
			STAGE3 = 4,
			STAGE4 = 5,
			STAGE5 = 6,
			STAGE6 = 7,
			STAGE7 = 8,
			STAGE8 = 9,
			STAGE9 = 10,
			STAGE10 = 11,
			CLEAR = 12,
		}
		#endregion
		public string GetMD5Hash(string input)
		{
			MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
			byte[] bs = Encoding.UTF8.GetBytes(input);
			bs = md5.ComputeHash(bs);
			StringBuilder s = new StringBuilder();
			foreach (byte b in bs)
			{
				s.Append(b.ToString("x2").ToLower());
			}
			return s.ToString();
		}
		public void SetAccountInfo(string password, string accountname)
		{
			this.accountname = accountname;
			this.password = GetMD5Hash(password);
		}
		public bool GetSessionID()
		{
			if (!logged)
			{
				server = "s2";
				HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://" + server + ".sfgame.de/request.php?req=00000000000000000000000000000000002" + accountname + ";" + password + ";");
				string res = Mgr.ResponseToString((HttpWebResponse)req.GetResponse());
				string[] data = res.Split('/', ';');
				int dj = (int)CacheFormat.NULL311 + 1;
				int a = dj;
				if (data.Length == (int)CacheFormat.NULL311 + 2)
				{
					this.sessionid = data[(int)CacheFormat.SESSIONID];
					logged = true;
					return true;
				}
				else if (data[0].ToString() == "E006")
				{
					logged = false;
					return false; //wrongpassword
				}
				else
				{
					logged = false;
					sessionid = "";
					return false;
				}
			}
			return true;
		}

		public string DoRequest(string id)
		{
			if (sessionid != "")
			{
				string url = "http://" + server + ".sfgame.de/request.php?req=" + sessionid + id;
				HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
				string response = Mgr.ResponseToString((HttpWebResponse)request.GetResponse());
				if (response == "E065" || response == "+E065")
				{
					logged = false;
					GetSessionID();
					return DoRequest(id);
				}
				else if (response[0] == 'E' || response[1] == 'E')
					return "";
				return response;
			}
			else
			{
				if (GetSessionID())
					return DoRequest(id);
				return "";
			}
		}
	}
}
